package com.huluobo.sign.view

import android.os.Build
import android.text.TextUtils
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import com.amap.api.maps.AMap
import com.amap.api.maps.MapView
import com.amap.api.maps.model.MyLocationStyle
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.blankj.utilcode.util.ToastUtils
import com.huluobo.lib_base.BaseApp
import com.huluobo.lib_base.BaseTitle
import com.huluobo.lib_base.UIState
import com.huluobo.lib_http.Const
import com.huluobo.sign.SignIntent
import com.huluobo.sign.SignViewModel
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.time.LocalTime
import java.util.Timer
import kotlin.concurrent.timerTask

/**
 *  Created by LC on 2025/3/15.
 */
lateinit var map: AMap
lateinit var mapView: MapView
lateinit var myLocationStyle: MyLocationStyle
lateinit var geocodeSearch: GeocodeSearch
lateinit var query: RegeocodeQuery
lateinit var timer: Timer

@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun SignCommitPage(navHostController: NavHostController, vm: SignViewModel = hiltViewModel()) {
    var startTime by remember {
        mutableStateOf("上班还未打卡")
    }

    var endTime by remember {
        mutableStateOf("下班还未打卡")
    }

    var btnName by remember {
        mutableStateOf("上班打卡")
    }

    var nowTime by remember {
        mutableStateOf("00:00:00")
    }

    var enable by remember {
        mutableStateOf(true)
    }

    val kv = MMKV.defaultMMKV()

    var lat = 0.0
    var lon = 0.0
    var type = ""
    var status = ""
    var address = ""

    LaunchedEffect(key1 = "", block = {
        launch {
            timer = Timer()
            timer.schedule(timerTask {
                nowTime = SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())
            }, 0, 1000)
        }

        launch {
            val signTime = kv.decodeString(Const.PARAM_SIGN_IN, "").toString()
            if (!TextUtils.isEmpty(signTime)) {
                val time = SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis())
                val signDate = signTime.substring(0, 10)
                if (time == signDate) {
                    startTime = "上班时间 : $signTime"
                    val outTime = kv.decodeString(Const.PARAM_SIGN_OUT, "")
                    val outDate = outTime?.substring(0, 10)
                    if (time == outDate) {
                        endTime = "下班时间 : $outTime"
                        enable = false
                    } else {
                        btnName = "下班打卡"
                    }
                }
            }
        }

        launch {
            vm.state.collect {
                when (it) {
                    is UIState.OnError -> {
                        Log.e("TagA", "添加签到信息失败:${it.msg}")
                    }

                    UIState.OnLoading -> {}
                    is UIState.OnSuccess<*> -> {
                        ToastUtils.showLong("签到/签退成功")
                        navHostController.popBackStack()
                    }
                }
            }
        }
    })

    Column(Modifier.padding(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
        BaseTitle(navHostController = navHostController, title = "签到/签退")
        AndroidView(modifier = Modifier.height(300.dp), factory = {
            mapView = MapView(it)
            mapView.onCreate(null)
            map = mapView.map
            myLocationStyle = MyLocationStyle()
            myLocationStyle.interval(2000)
            map.myLocationStyle = myLocationStyle
            map.isMyLocationEnabled = true
            map.addOnMyLocationChangeListener { location ->
                lon = location.longitude
                lat = location.latitude
                geocodeSearch = GeocodeSearch(BaseApp.context)
                query = RegeocodeQuery(LatLonPoint(location.latitude, location.longitude), 200f, GeocodeSearch.AMAP)
                geocodeSearch.getFromLocationAsyn(query)
                geocodeSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
                    override fun onRegeocodeSearched(result: RegeocodeResult?, errorCode: Int) {
                        address = "${result?.regeocodeAddress?.formatAddress}"
                    }

                    override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
                    }
                })
            }
            mapView
        })

        Spacer(modifier = Modifier.height(50.dp))
        Text(
            text = startTime,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Text(
            text = endTime,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Button(modifier = Modifier
            .size(140.dp)
            .clip(CircleShape), enabled = enable, onClick = {
            val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis())
            val workTime = SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())
            if (btnName == "上班打卡") {
                kv.encode(Const.PARAM_SIGN_IN, time)
                val workStart = LocalTime.of(8, 0)
                if (LocalTime.parse(workTime).isAfter(workStart)) {
                    startTime = "上班时间 : $time 迟到"
                    status = "迟到"
                } else {
                    startTime = "上班时间 : $time 打卡正常"
                    status = "正常"
                }
                type = "上班"
                btnName = "下班打卡"
                val map = mapOf(
                    Const.PARAM_SIGN_LAT to lat,
                    Const.PARAM_SIGN_LON to lon,
                    Const.PARAM_SIGN_TYPE to type,
                    Const.PARAM_SIGN_STATUS to status,
                    Const.PARAM_SIGN_ADDRESS to address,
                )
                vm.sendIntent(SignIntent.AddSign(map))
            } else {
                kv.encode(Const.PARAM_SIGN_OUT, time)
                val workEnd = LocalTime.of(17, 0)
                if (LocalTime.parse(workTime).isBefore(workEnd)) {
                    endTime = "下班时间 : $time 早退"
                    status = "早退"
                } else {
                    endTime = "下班时间 : $time 打卡正常"
                    status = "正常"
                }
                enable = false
                type = "下班"
                val map = mapOf(
                    Const.PARAM_SIGN_LAT to lat,
                    Const.PARAM_SIGN_LON to lon,
                    Const.PARAM_SIGN_TYPE to type,
                    Const.PARAM_SIGN_STATUS to status,
                    Const.PARAM_SIGN_ADDRESS to address,
                )
                vm.sendIntent(SignIntent.AddSign(map))
            }
        }) {
            Column {
                Text(text = btnName, fontSize = 22.sp)
                Text(text = nowTime, fontSize = 22.sp)
            }
        }
    }
}